#ifndef _INTARRAY_H_CSEAPI_
#define _INTARRAY_H_CSEAPI_

class CSE_IMPEXP_IN TIntArray
{
private:
    TBool copyFrom(const TInt* pSour, int iLen, int iOff) const;
    TIntArray& joinEx(const TInt *pSour, int iSourLen);
    void insertEx(int iPos, const TInt *pSour, const int iLen);

protected:
    TInt *m_data;
    TInt *transfer(TInt *pOther);

public:
    TIntArray();
    TIntArray(int MagicNum, TIntArray& tArray);
    
    TIntArray(const TIntArray& tArray);
    TIntArray(int count);
    TIntArray(const TInt* pSour, int n, int iExt=0);
    ~TIntArray();

    TIntArray& join(const TIntArray& tArray, int index=0);
    TIntArray& join(const TInt *pSour, int iSourLen);

    TIntArray& operator=(const TIntArray& tArray);

    void operator+=(const TIntArray& tArray);
    void operator+=(TInt i);
    TIntArray multi(int n) const;

    static TIntArray vformat(int ArgNum, va_list ArgPtr);
    static TIntArray format(int ArgNum, ...);

    TInt& sub(int index) const;         // same to operator[]
    TInt& operator[](int index) const;

    TInt *addr() const;
    int len() const;
    TBool isEmpty() const;
    TInt compare(const TIntArray& tOther) const;

    TIntArray slice(int index, int iLen=-1) const;

    void exchange(TIntArray& other);
    TInt append(TInt i);
    TIntArray& add(TInt i, int *pIndex=NULL);
    const TIntObj& insert(int index, const TIntObj& obj);
    void remove(int index, int iLen=1);

    void clear();
    int truncate(int iLen) const;
    int sortAdd(TInt iValue);
    void sort() const;

    int find(TInt iValue, int from=0) const;
    void resize(int iSize);
    TCharArray str() const;
    
    TBool enumItem(void*& pIter, TInt *pRet=NULL) const;

    TBool operator==(const TIntArray& y) const;
    TBool operator!=(const TIntArray& y) const;
    TBool operator>(const TIntArray& y) const;
    TBool operator>=(const TIntArray& y) const;
    TBool operator<(const TIntArray& y) const;
    TBool operator<=(const TIntArray& y) const;
};

extern CSE_IMPEXP_IN const TIntArray& CseEmptyTier;

#endif
